iOSアプリ開発でZXing2.1を使ってQRコードを読み取る
今回は、iOSアプリ開発で ZXing ライブラリを使い、URLの QRコード を読み取り、ブラウザで表示するサンプルを作ってみたいと思います。
ちなみに ZXing の概要とAndroid版については、「Android Tips #41 ZXing ライブラリ (2.1) を使って QR コードを読み取る」 を参考にしてください。
環境構築
今回は、以下の環境を使用します。
- ZXing 2.1
- Xcode 4.6
- iOS SDK 6.1
- iPod touch 5th
まず、サンプル用のプロジェクトを作成します。
「MyProject」フォルダを作成し、その中に「SampleZXing」プロジェクトを作成します
(「Single View Application」テンプレート、ストーリーボード使用、ARC使用)。
次にライブラリをダウンロードします。
http://code.google.com/p/zxing/downloads/list から ZXing-2.1.zip をダウンロードしましょう。
ダウンロードしたら、同じく「MyProject」フォルダに入れておきます。
この中の「iphone」フォルダに「README」ファイルがあり、詳しく構築手順が載っているので(英語ですが、、)、
これに沿って構築していきます。
Xcodeのバージョンの違いからか、はまったところがいくつかあったので、スクリーンショットを多めに載せていこうと思います。
1. プロジェクトにZXingWidgetを追加する
ドラッグ&ドロップで ZXingWidget.xcodeproj をSampleZXingプロジェクトに追加します。
2. ZXingWidgetライブラリをリンクする
下の画面の順に操作していき、ライブラリ追加ウィンドウを表示します。
ライブラリ追加ウィンドウが表示されたら、libZXingWidget.a を追加します。
3. Target DependenciesにZXingWidgetを追加する
これも下の画面の順に操作していき、追加ウィンドウを表示します。
追加ウィンドウが表示されたら、ZXingWidget を追加します。
4. Header search path を追加する その1
下の画面の順に操作していき、Header search paths に ../zxing-2.1/iphone/ZXingWidget/Classes を recursive で追加します。
5. Header search path を追加する その2
同じように Header search paths に ../zxing-2.1/cpp/core/src を non-recursive で追加します。
6. フレームワークを追加する
以下のフレームワークを追加します。
- AVFoundation
- AudioToolbox
- CoreVideo
- CoreMedia
- libiconv
- AddressBook
- AddressBookUI
追加後は以下の画面のようになります。
7. 環境構築完了
これで実装する準備がほぼ整いました。(原文は、7. You're almost ready to go ..)
とありますが、ビルドするとこんな感じに。。。
エラーをなくすために、Other Warning Flags から -Werror を削除します。
今度こそ、ほぼ構築完了です。
サンプルの実装
サンプルの画面を作っていきます。シンプルに読み取り画面を表示するボタンだけ配置します。
次にヘッダーファイルを作成します。
ViewController.h
#import <UIKit/UIKit.h> #import <ZXingWidgetController.h> #import <QRCodeReader.h> @interface ViewController : UIViewController <ZXingDelegate> - (IBAction)showReadViewPressed:(id)sender; @end
インポート文、デリゲート、ハンドラを追加しましたが、ビルドするとエラーが出ました。。。
これを直すには、ViewController.mファイルの拡張子を mm に変更し、
ViewController.mm にしてあげる必要があるようです(C++を使用しているため)。
拡張子を変更したら、処理を実装します。
ViewController.mm
#import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; } - (IBAction)showReadViewPressed:(id)sender { // 読み取り画面を生成します。 ZXingWidgetController *zxingWidgetController = [[ZXingWidgetController alloc] initWithDelegate:self showCancel:YES OneDMode:NO]; QRCodeReader *qrcodeReader = [[QRCodeReader alloc] init]; zxingWidgetController.readers = [[NSSet alloc] initWithObjects:qrcodeReader, nil]; // 読み取り画面を表示します。 [self presentViewController:zxingWidgetController animated:NO completion:nil]; } - (void)zxingController:(ZXingWidgetController*)controller didScanResult:(NSString *)result { // 読み取り画面を閉じます。 [self dismissViewControllerAnimated:NO completion:nil]; // ブラウザを起動します。 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:result]]; } - (void)zxingControllerDidCancel:(ZXingWidgetController*)controller { // 読み取り画面を閉じます。 [self dismissViewControllerAnimated:NO completion:nil]; } @end
「読み取り画面表示」ボタンタップ時には読み取り画面を表示します。
読み取り画面で、読み取り成功時には読み取り画面を閉じて、ブザウザを起動させ、
「キャンセル」ボタンタップ時には読み取り画面を閉じています。
これで、サンプル完成! と思いきや、そうはいきませんでした。
ビルドすると、またしてもエラーが出ました。今度は31個。。。
これを直すには、Apple LLVM compiler 4.2 - Language の C++ Language Dialect と C++ Standard Library を Compiler Default にしてあげる必要があります。
下の画面の順に操作していき、修正します。
修正するとこのようになります。
今度こそ、サンプルの実装は完了です。
動作確認
まず、QRコードを用意します。このコードは文字列にすると http://classmethod.jp になります。
アプリを起動します。
「読み取り画面表示」ボタンをタップして、読み取り画面を表示して、QRコードを認識させます。
QRコードを認識した直後に、ブラウザが起動しました!
少し設定に手間がかかりましたが、なんとかできました。
ちなみに、設定周りについては、付属のサンプル(zxing-2.1/iphone/Barcodes/Barcodes.xcodeproj)が参考になります。
ZXingWidget.xcodeproj の Other Warning Flags から -Werror を削除するだけで動きました。
ではでは。